'''
Created on 01/09/2013

@author: daniel
'''
import nodo
import lista
import unittest

class ListaEnlazada (lista.Lista):
    '''
    clase concreta que hereda de Lista
    '''
    def __init__(self):
        lista.Lista.__init__(self)
        self.nodo1=None
    
    def elemento(self,pos):
        auxnodo=self.nodo1
        i=0
        while(i<self.tamanio):
            if(pos==i):return auxnodo.getObjeto()
            auxnodo=auxnodo.getLink()
            i+=1
    
    def agregar(self,elem,pos):
        if(self.tamanio==0):
            self.nodo1=nodo.Nodo(elem)
            self.tamanio+=1
            return
        else:    
            i=0
            auxnodo=self.nodo1
            while(i<self.tamanio-1):
                if (pos==i):
                    auxnodo.setObjeto(elem)#sobreescribe
                    return
                else:
                    auxnodo=auxnodo.getLink()#va al sig
                    i+=1
            auxnodo.setLink(nodo.Nodo(elem))#crea nodo
            self.tamanio+=1
                
                
        
    def eliminar(self,pos):
        if(pos==0):
            self.nodo1=self.nodo1.getLink()
            self.tamanio-=1
            return 1
        else:
            i=1
            auxnodo=self.nodo1
            while(i<self.tamanio):
                if(pos==i):
                    elim=auxnodo.getLink().getObjeto()
                    auxnodo.setLink(auxnodo.getLink().getLink())
                    self.tamanio-=1
                    return elim
                auxnodo=auxnodo.getLink()
                i+=1
            return 1
        
    def esVacia(self):
        if(self.tamanio==0):return True
        else:
            return False 
    
    def incluye(self,elem):
        auxnodo=self.nodo1
        i=0
        while(i<self.tamanio):
            if(auxnodo.getObjeto()is elem):return True
            auxnodo=auxnodo.getLink()
            i+=1
        return False

class Test(unittest.TestCase):

    def testInit(self):
        self.assertIsInstance(ListaEnlazada(),ListaEnlazada, "testea creaciona de lista")

    def testAgregar(self):
        obj=ListaEnlazada()
        obj.agregar(23,23)
        self.assertIsNotNone(obj.nodo1, "verifica existencia de elemento")
    
    def testElemento(self):
        obj=ListaEnlazada()
        obj.agregar(1,23)
        obj.agregar(2,23)
        obj.agregar(3,23)
        self.assertEquals(obj.elemento(1),2, "verifica existencia del dato")
    
    def testEliminar(self):
        obj=ListaEnlazada()
        obj.agregar(1,23)
        self.assertIsNotNone(obj.nodo1, "verifica existencia de elemento")
        elim=obj.eliminar(0)
        self.assertIsNone(obj.nodo1, "verifica la no existencia de elemento")
        self.assertEquals(elim, 1,"elemento eliminado")
    
    def testEsVacia(self):
        obj=ListaEnlazada()
        self.assertTrue(obj.esVacia(), "Verifica devolucion correcta")
        obj.agregar(1,23)
        self.assertFalse(obj.esVacia(), "Verifica devolucion correcta")
    
    def testIncluye(self):
        obj=ListaEnlazada()
        obj.agregar(1,23)
        obj.agregar(2,23)
        obj.agregar(3,23)
        self.assertTrue(obj.incluye(2), "Verifica devolucion correcta")
        self.assertFalse(obj.incluye(4), "Verifica devolucion correcta")

    def testGetTamanio(self):
        obj=ListaEnlazada()
        obj.agregar(1,23)
        obj.agregar(2,23)
        obj.agregar(3,23)
        self.assertTrue(obj.getTamanio()==3, "Verifica devolucion correcta del tamanio")
        
        
if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()